home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / role / DebugTool_111.lha / srcheader.c < prev    next >
C/C++ Source or Header  |  1993-05-06  |  9KB  |  421 lines

  1. #include "frobnitz.h"
  2.  
  3. /*******************************************************************/
  4. /*  Funktion: ReadHeader                                           */
  5. /*******************************************************************/
  6.  
  7. void
  8. ReadHeader (void)
  9. {
  10.   seek_pos ((z_word) 0);
  11.  
  12.   if (fread (&header, sizeof (header), 1, DatFile) < 1)
  13.     {
  14.       quit (1);
  15.     }
  16.  
  17. #ifndef AMIGA
  18.   SwapHeader ();
  19. #endif
  20.  
  21.   old_header = ((header.z_version == 3) ? 1 : 0);
  22. }
  23.  
  24. /*******************************************************************/
  25. /*  Funktion: PrintHeader                                          */
  26. /*******************************************************************/
  27.  
  28. void
  29. PrintHeader (void)
  30. {
  31.   int i;
  32.   byte no_ver;
  33.  
  34.   static char *version_name[] =
  35.   {
  36.     "unknown version",
  37.     "ZIP [very old]",
  38.     "ZIP [old]",
  39.     "ZIP",
  40.     "EZIP",
  41.     "XZIP",
  42.     "YZIP"
  43.   };
  44.  
  45.   static char *flag = ";flag ";
  46.  
  47.   static char *zip_flags_V3_notset[] =
  48.   {
  49.     "byte normal",
  50.     ";SCORE display",
  51.     "",
  52.     "",
  53.     "",
  54.     "",
  55.     "",
  56.     ""
  57.   };
  58.  
  59.   static char *zip_flags_V3_set[] =
  60.   {
  61.     "byte swapped",
  62.     ";TIME display",
  63.     "",
  64.     ";Tandy",
  65.     ";no status line",
  66.     ";status windows",
  67.     ";prop_fonts",
  68.     ""
  69.   };
  70.  
  71.   static char *zip_flags_V4_notset[] =
  72.   {
  73.     "no colours",
  74.     "",
  75.     "",
  76.     ";no underline",
  77.     "",
  78.     "",
  79.     "",
  80.     ""
  81.   };
  82.  
  83.   static char *zip_flags_V4_set[] =
  84.   {
  85.     "colours",
  86.     "",
  87.     ";max data area",
  88.     ";underline",
  89.     "",
  90.     "",
  91.     "",
  92.     ""
  93.   };
  94.  
  95.   static char *game_flags_V3_notset[] =
  96.   {
  97.     "script OFF",
  98.     "",
  99.     "",
  100.     "",
  101.     "",
  102.     "",
  103.     "",
  104.     "",
  105.     "",
  106.     "",
  107.     "",
  108.     "",
  109.     "",
  110.     "",
  111.     "",
  112.     ""
  113.   };
  114.  
  115.   static char *game_flags_V3_set[] =
  116.   {
  117.     "script ON",
  118.     ";fixed font",
  119.     ";refresh",
  120.     "",
  121.     ";sound",
  122.     "",
  123.     "",
  124.     "",
  125.     "",
  126.     "",
  127.     "",
  128.     "",
  129.     "",
  130.     "",
  131.     "",
  132.     ""
  133.   };
  134.  
  135.   static char *game_flags_V4_notset[] =
  136.   {
  137.     "script OFF",
  138.     "",
  139.     "",
  140.     "",
  141.     "",
  142.     "",
  143.     "",
  144.     "",
  145.     "",
  146.     "",
  147.     "",
  148.     "",
  149.     "",
  150.     "",
  151.     "",
  152.     ""
  153.   };
  154.  
  155.   static char *game_flags_V4_set[] =
  156.   {
  157.     "script ON",
  158.     ";fixed font",
  159.     ";refresh",
  160.     ";graphics",
  161.     ";undo",
  162.     ";mouse",
  163.     ";colour",
  164.     ";sound",
  165.     ";no command line",
  166.     "",
  167.     "",
  168.     "",
  169.     "",
  170.     "",
  171.     "",
  172.     ""
  173.   };
  174.  
  175.   static char *interpreters[] =
  176.   {
  177.     "Unknown",
  178.     "DEC-20 / Debugging",
  179.     "Apple IIe",
  180.     "Macintosh",
  181.     "Amiga",
  182.     "Atari ST",
  183.     "IBM",
  184.     "Commodore 128",
  185.     "Commodore 64",
  186.     "Apple IIc",
  187.     "Apple IIgs",
  188.     "Tandy Color Computer"
  189.   };
  190.  
  191.   printf ("DATA FILE HEADER:\n\n");
  192.  
  193.   printf ("Z-code version:  %d ", header.z_version);
  194.   printf ("(%s)\n", ((header.z_version > 6) ? version_name[0] : version_name[header.z_version]));
  195.  
  196.   printf ("ZIP Flags:       $%x (", header.zip_flags);
  197.  
  198.   for (i = 0; i < 8; i++)
  199.     {
  200.       if (!(header.zip_flags & power (2, i)))
  201.     printf ("%s", ((old_header) ? zip_flags_V3_notset[i] : zip_flags_V4_notset[i]));
  202.       else
  203.     {
  204.       if (old_header)
  205.         {
  206.           if (strlen (zip_flags_V3_set[i]))
  207.         printf ("%s", zip_flags_V3_set[i]);
  208.           else
  209.         printf ("%s%d", flag, i);
  210.         }
  211.       else
  212.         {
  213.           if (strlen (zip_flags_V4_set[i]))
  214.         printf ("%s", zip_flags_V4_set[i]);
  215.           else
  216.         printf ("%s%d", flag, i);
  217.         }
  218.     }
  219.     }
  220.   printf (")\n");
  221.  
  222.   printf ("Release number:  %d\n", (header.release & 0x7ff));
  223.   printf ("Resident size:   $%x\n", header.resident_size);
  224.   printf ("Game offset:     $%x\n", header.game_offset);
  225.   printf ("Vocab offset:    $%x\n", header.vocab_offset);
  226.   printf ("Object offset:   $%x\n", header.object_offset);
  227.   printf ("GlobVar offset:  $%x\n", header.variable_offset);
  228.   printf ("Save area size:  $%x\n", header.save_area_size);
  229.  
  230.   printf ("Game flags:      $%x (", header.game_flags);
  231.   for (i = 0; i < 16; i++)
  232.     {
  233.       if (!(header.game_flags & power (2, i)))
  234.     printf ("%s", ((old_header) ? game_flags_V3_notset[i] : game_flags_V4_notset[i]));
  235.       else
  236.     {
  237.       if (old_header)
  238.         {
  239.           if (strlen (game_flags_V3_set[i]))
  240.         printf ("%s", game_flags_V3_set[i]);
  241.           else
  242.         printf ("%s%d", flag, i);
  243.         }
  244.       else
  245.         {
  246.           if (strlen (game_flags_V4_set[i]))
  247.         printf ("%s", game_flags_V4_set[i]);
  248.           else
  249.         printf ("%s%d", flag, i);
  250.         }
  251.     }
  252.     }
  253.   printf (")\n");
  254.  
  255.   printf ("Serial number:   ");
  256.   i = 0;
  257.   while (i < 6)
  258.     {
  259.       printf ("%c", header.rev_date[i]);
  260.       i++;
  261.     }
  262.   printf ("%s", ((header.rev_date[0] == 0x38) ? "" : " (no official release)"));
  263.   newline ();
  264.  
  265.   printf ("Macro offset:    $%x\n", header.macro_offset);
  266.  
  267.   printf ("$Verify length:  $%x", header.verify_length);
  268.   no_ver = ((header.verify_length == 0) ? 1 : 0);
  269.   if (no_ver)
  270.     printf (" (no officially released datafile)");
  271.   newline ();
  272.  
  273.   if (no_ver == 0)
  274.     printf ("$Verify chksm:   $%x\n", header.verify_checksum);
  275.  
  276.   if (header.zmach_version != 0)
  277.     {
  278.       printf ("Interpreter:     %s", ((header.zmach_version > 11) ? interpreters[0] : interpreters[header.zmach_version]));
  279.       printf (" (%d) version ", header.zmach_version);
  280.       if ((islower (header.zmach_subversion))
  281.       ||
  282.       (isupper (header.zmach_subversion)))
  283.     printf ("%c", header.zmach_subversion);
  284.       else
  285.     printf ("%d", header.zmach_subversion);
  286.       newline ();
  287.     }
  288.  
  289.   if (header.screen_rows != 0)
  290.     {
  291.       printf ("Screen:          %d rows x %d columns", header.screen_rows, header.screen_columns);
  292.       newline ();
  293.       printf ("                 (left: %d; right: %d; top: %d; bottom: %d)", header.screen_left, header.screen_right, header.screen_top, header.screen_bottom);
  294.       newline ();
  295.     }
  296.  
  297.   if (header.max_char_width != 0)
  298.     {
  299.       printf ("Max Charsize:    %d wide x %d high", header.max_char_width, header.max_char_height);
  300.       newline ();
  301.     }
  302.  
  303.   if (header.unknown0 != 0)
  304.     printf ("Unknown 0:       $%x\n", header.unknown0);
  305.  
  306.   if (header.unknown1 != 0)
  307.     printf ("Unknown 1:       $%x\n", header.unknown1);
  308.  
  309.   if (header.unknown2 != 0)
  310.     printf ("Unknown 2:       $%x\n", header.unknown2);
  311.  
  312.   if (header.fkey_offset != 0)
  313.     printf ("FKey offset:     $%x\n", header.fkey_offset);
  314.  
  315.   if (header.unknown4 != 0)
  316.     printf ("Unknown 4:       $%x\n", header.unknown4);
  317.  
  318.   if (header.unknown5 != 0)
  319.     printf ("Unknown 5:       $%x\n", header.unknown5);
  320.  
  321.   if (header.alfabet_offset != 0)
  322.     printf ("Alphabet offset: $%x\n", header.alfabet_offset);
  323.  
  324.   if (header.mouse_offset != 0)
  325.     printf ("Mouse offset:    $%x\n", header.mouse_offset);
  326.  
  327.   if (header.user_name[0] != 0)
  328.     {
  329.       printf ("User Name:       ");
  330.       i = 0;
  331.       while ((header.user_name[i] != 0) && (i < 8))
  332.     {
  333.       printf ("%c", header.user_name[i]);
  334.       i++;
  335.     }
  336.       newline ();
  337.     }
  338. }
  339.  
  340. /*******************************************************************/
  341. /*  Funktion: HeaderLevel                                          */
  342. /*******************************************************************/
  343.  
  344. void
  345. HeaderLevel (void)
  346. {
  347.   int c = 0;
  348.   int i, j;
  349.   int file_ok = 0;
  350.  
  351.   header_level = 0;
  352.  
  353.   for (i = 0; i < 5; i++)
  354.     {
  355.       if (fseek (DatFile, (i * 512), SEEK_SET))
  356.     quit (1);
  357.       c = getc (DatFile);
  358.  
  359.       if ((c > 2) && (c < 7))
  360.     {
  361.       header_level = i;
  362.       file_ok = 1;
  363.       for (j = 0; j < 17; j++)
  364.         {
  365.           c = getc (DatFile);
  366.         }
  367.       for (j = 0; j < 6; j++)
  368.         {
  369.           if (!(isprint (c = getc (DatFile))))
  370.         file_ok = 0;
  371.         }
  372.     }
  373.       if (file_ok)
  374.     break;
  375.     }
  376.  
  377. /*
  378.  *  Known header levels:
  379.  *    (a) Datafiles:    0
  380.  *    (b) Savefiles:    0 - InfoTaskForce
  381.  *            1 - Amiga & Atari ZMachine 3; Pfaller/Barthel
  382.  *            2 - Amiga ZMachine 4/5/6; Atari ZMachine 4/5;
  383.  *                IBM ZMachine 3/4; Mark Howell's ZIP
  384.  *            4 - IBM ZMachine 5/6
  385.  */
  386.  
  387.   if (!file_ok)
  388.     quit (2);
  389. }
  390.  
  391. /*******************************************************************/
  392. /*  Funktion: IsSavefile                                           */
  393. /*******************************************************************/
  394.  
  395. void
  396. IsSavefile (void)
  397. {
  398.   is_savefile = ((header_level) ? 1 :
  399.          ((fseek (DatFile, (unsigned long) (header.vocab_offset + (header_level) * 512), SEEK_SET)) ? 1 : 0));
  400. }
  401.  
  402. /*******************************************************************/
  403. /*  Funktion: SwapHeader                                           */
  404. /*******************************************************************/
  405.  
  406. void
  407. SwapHeader (void)
  408. {
  409.   header.release = byteswap (header.release);
  410.   header.resident_size = byteswap (header.resident_size);
  411.   header.game_offset = byteswap (header.game_offset);
  412.   header.vocab_offset = byteswap (header.vocab_offset);
  413.   header.object_offset = byteswap (header.object_offset);
  414.   header.variable_offset = byteswap (header.variable_offset);
  415.   header.save_area_size = byteswap (header.save_area_size);
  416.   header.game_flags = byteswap (header.game_flags);
  417.   header.macro_offset = byteswap (header.macro_offset);
  418.   header.verify_length = byteswap (header.verify_length);
  419.   header.verify_checksum = byteswap (header.verify_checksum);
  420. }
  421.